home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1994 December / PSL Monthly Shareware CD-ROM (Public Software Library)(December 1994).bin / prgmming / dos / asm / load.asm < prev    next >
Assembly Source File  |  1984-03-04  |  3KB  |  121 lines

  1.     NAME     LOAD
  2.     PAGE     55,128
  3.     TITLE    'LOAD -- LOAD .COM FILE FOR MS-DOS 2.0'
  4. ;
  5. ;
  6. ; LOAD -- LOAD .COM FILE BIGGER THAN 64K
  7. ; REQUIRES MS-DOS 2.0
  8. ; VERSION 1.1    DEC 83 RGD
  9. ; VERSION 1    MARCH 1983 RJW
  10.  
  11. ; COPYRIGHT (C) 1983
  12. ; LABORATORY MICROSYSTEMS
  13. ; 4147 BEETHOVEN STREET
  14. ; LOS ANGELES, CA  90066
  15. ;
  16. CR    EQU    0DH    ;ASCII CARRIAGE RETURN
  17. LF    EQU    0AH    ;ASCII LINE FEED
  18.  
  19. CSEG    SEGMENT BYTE
  20.  
  21.     ORG    100H
  22.  
  23.     ASSUME    CS:CSEG,DS:CSEG
  24.  
  25. LOAD    PROC    FAR        ; SETS UP FAR RETURN ...
  26.  
  27.     PUSH    ES        ; SAVE SEGMENT OF PSP
  28.     MOV    DX,OFFSET MES2    ; STARTUP MESSAGE
  29.     MOV    AH,9
  30.     INT    21H
  31.     XOR    DX,DX        ; ZERO DX
  32.     MOV    AH,25H        ; SET TERMINATE ADDRESS ...
  33.     MOV    AL,22H        ; ... FOR NEW PROGRAM SEGMENT
  34.     INT    21H
  35.  
  36.     MOV    DX,OFFSET ENDOFS ; OFFSET TO END OF THIS LOADER
  37.     MOV    CL,4        ; NO OF BITS TO SHIFT
  38.     SHR    DX,CL        ; CONVERT BYTE ADDR TO PARAGRAPH
  39.     INC    DX        ; OFFSET OF 1ST AVAILABLE SEGMENT
  40.     MOV    AX,CS        ; CURRENT SEGMENT TO AX
  41.     ADD    DX,AX        ; ACTUAL VALUE OF 1ST AVAILABLE SEGMENT
  42.     MOV    USEG,DX     ; SAVE IT FOR LATER ...
  43.     MOV    ES,DX        ; ... AND FOR SUBSEQUENT MOVE
  44.     MOV    AH,26H        ; CALL TO DOS
  45.     INT    21H        ; CREATE NEW PROGRAM SEGMENT
  46.  
  47.     MOV    SI,6CH        ; 2ND PARAM FCB IN CURRENT SEGMENT
  48.     MOV    DI,5CH        ; 1ST PARAM FCB IN NEW SEGMENT
  49.     MOV    CX,0CH        ; BYTE COUNT FOR MOVE
  50.     REPZ MOVSB        ; COPY THE FILENAME
  51.  
  52.     MOV    AX,CS        ; COPY CURRENT CODE SEG ...
  53.     MOV    DS,AX        ; ... TO DS
  54.     MOV    DX,5CH        ; DS:DX POINTS TO FCB OF .COM FILE
  55.     MOV    BX,DX        ; MAKE FCB ADDRESSIBLE
  56.     MOV    BYTE PTR  9 [BX],'C' ; FORCE COM EXTENSION
  57.     MOV    BYTE PTR 10 [BX],'O'
  58.     MOV    BYTE PTR 11 [BX],'M'
  59.     MOV    AH,0FH        ; OPEN THE .COM FILE
  60.     INT    21H
  61.     OR    AL,AL        ; TEST RETURN CODE
  62.     JNZ    LOAD8        ; EXIT IF NON-ZERO
  63.     MOV    WORD PTR 33 [BX],0000 ; ZERO THE RANDOM
  64.     MOV    WORD PTR 35 [BX],0000 ; RECORD FIELD IN THE FCB
  65.     POP    ES        ; GET LOADER'S PSP SEGMENT
  66.     MOV    BX,USEG     ; LET SS:SP = DEFAULT BUFFER OF
  67.     MOV    SS,BX        ; NEW PSP
  68.     MOV    SP,100H
  69.     PUSH    ES        ; SAVE LOADER'S PSP AGAIN
  70.     ADD    BX,10H        ; BX = SEGMENT OF CURRENT DTA
  71.     MOV    DS,BX        ; SET UP DS:DX TO POINT TO THE DTA
  72.     XOR    DX,DX
  73.     MOV    AH,1AH        ; SET UP DOS CALL AND DO IT
  74.     INT    21H
  75.  
  76. LOAD5:    MOV    CX,100H     ; NUMBER OF RECORDS OF LENGTH 80H
  77.     MOV    AX,CS        ; COPY CURRENT CS TO DS
  78.     MOV    DS,AX
  79.     MOV    DX,5CH        ; DS:DH POINTS TO FCB OF .COM FILE
  80.     MOV    AH,27H        ; DO RANDOM BLOCK READ
  81.     INT    21H
  82.     TEST    AL,1        ; END OF FILE?
  83.     JNZ    LOAD9        ; YES, SO EXIT
  84.     ADD    BX,800H     ; INCREMENT LOCATION OF DTA
  85.     MOV    DS,BX        ; COPY TO DS
  86.     XOR    DX,DX        ; DS:DX NOW POINTS TO NEXT DTA
  87.     MOV    AH,1AH        ; SET UP DOS CALL TO SET DTA
  88.     INT    21H
  89.     JMP    LOAD5        ; DO IT AGAIN
  90.  
  91. LOAD8:    MOV    DX,OFFSET MES1    ; "FILE NOT FOUND"
  92.     MOV    AH,9        ; WRITE TO TERMINAL
  93.     INT    21H
  94.     INT    20H        ; EXIT TO DOS
  95.  
  96. LOAD9:    MOV    AX,USEG     ; SET UP REGISTERS FOR NEW SEGMENT
  97.     MOV    DS,AX
  98.     POP    ES        ; PASS LOADER'S PSP SEGMENT TO OVERLAY
  99.     PUSH    AX        ; PUSH NEW CS ONTO STACK
  100.     MOV    AX,100H
  101.     PUSH    AX        ; PUSH OFFSET ONTO STACK
  102.     RET            ; FAR RETURN CAUSES CS:IP TO BE SET
  103. LOAD    ENDP
  104.  
  105. MES1    DB    CR,LF,
  106.     DB    '.COM FILE NOT FOUND'
  107.     DB    CR,LF,'$'
  108. MES2    DB    CR,LF
  109.     DB    'MULTI-SEGMENT LOADER VERSION 1.1 FOR MS-DOS 2.0'
  110.     DB    CR,LF
  111.     DB    'COPYRIGHT (C) 1983 LABORATORY MICROSYSTEMS INC.'
  112.     DB    CR,LF,'$'
  113.  
  114. USEG    DW    0
  115.  
  116. ENDOFS    EQU    $
  117.  
  118. CSEG    ENDS            ; END OF CODE SEGMENT
  119.  
  120.     END    LOAD
  121.